package com.kaifamiao.wrapper;

/**
 * 1、自动装箱(auto-boxing) 是 JDK 1.5 老特性
 *    说人话: 就是自动将一个基本数据类型的数值包裹到其相应的包装类类型的实例中
 *    本质上编译器在编译阶段用 valueOf(primitive) 方法替换了原来的代码
 * 2、除了 Float 和 Double 外，另外六个基本数据类型对应包装类内部都使用了缓存
 * 3、使用 valueOf(primitive) 方法来获取基本数据类型数值对应的包装类对象可以优先使用已经缓存的对象
 */
public class WhyValueOf {

    public static void main(String[] args) {
        // 将100包裹到一个Integer实例中，然后将该实例的首地址赋值给等号前的引用变量
        Integer x = 100; // 本质: Integer x = Integer.valueOf(100)
        Integer y = 100;
        // 运算符 == 用来比较两个值是否相等，比如比较两个变量中存储的值是否相等
        System.out.println( x == y ); // true
        System.out.println( x.equals( y ) ); // true

        // 将1000包裹到一个Integer实例中，然后将该实例的首地址赋值给等号前的引用变量
        Integer a = 1000; // 本质: Integer a = Integer.valueOf(1000)
        Integer b = 1000;
        // 运算符 == 用来比较两个值是否相等，比如比较两个变量中存储的值是否相等
        System.out.println( a == b ); // false
        System.out.println( a.equals( b ) ); // true

        System.out.println( "- ".repeat( 15 ) );

        Long first = Long.valueOf( 100 );
        Long second = Long.valueOf( 100 );
        System.out.println( first == second );
        System.out.println( first.equals( second ) );

        Short third = Short.valueOf( (short)128 );
        Short fourth = Short.valueOf( (short)128 );
        System.out.println( third == fourth );
        System.out.println( third.equals( fourth ) );

    }

}
